package gestionCandidats;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.util.SortedSet;

import javax.swing.AbstractAction;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.BevelBorder;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableModel;

import modele.Dossier;
import modele.Etudiant;
import modele.Evaluation;
import modele.Parcours;

public class EvaluationAfficheAction 
extends AbstractAction  {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	protected String[] columnToolTips = {
			"<html>OUI = le dossier est complet</html>",
			"<html>OUI = BAC+4 acquis</html>",
			"<html>La moyenne de la maitrise<br>coefficient 3/4</html>",
			"<html>Le nombre d'annees pour obtenir la maitrise<br>-0,5 pour chaque annee supplementaire</html>",
			"<html>La moyenne de la licence<br>coefficient 1/4</html>",
			"<html>Le nombre d'annees pour obtenir la licence<br>-0,5 pour chaque annee supplementaire</html>",
			"<html>La note calculee :<ol><li>Moyenne : note = (3*(Bac+4)+(Bac+3))/4</li><li>Redoublement : note -= (nbBac+4 + nbBac+3 -2)/2</li><li>Origine : note -= 2 si diplome etranger</li><li>Cursus : note -= 2 si MIAGe, info indus ...<br> note -= 4 si Autre</li></html>",
			"<html>La note qui determine l'ordre global</html>",
			"<html><li>NON = refus categorique</li><li>OUI = proposition et/ou listes supplementaires</li></html>",
			"<html>Remarque qui sera publiee sur le courrier a l'etudiant en cas de refus de dossier</html>"
	};

	GestionCandidats appli;
	JScrollPane scrollpane;
	JPanel vue;
	JPanel cursus, notes, interdits, pied;// acquises, pied;
	JButton suite;
	DossierAfficheAction dafa;
	JComponent[][] attributs;
	TableModel dataModel;
	JTable evaValeurs;

	Dossier dos;
	Etudiant etu;
	Evaluation eva;

	JCheckBox[] jcbInterdits;
	//JComboBox<String>[] jcbAcquises;
	SortedSet<Parcours> lParcours;
	//SortedSet<UniteEnseignement> lUes;

	protected EvaluationAfficheAction(GestionCandidats appli, DossierAfficheAction dafa) {
		super("EvaluationAfficheAction");
		this.appli = appli;
		this.dafa = dafa;
		vue = appli.getEvaluationAffiche();
	}	

	//	private JComboBox getUesJCB(SortedSet<UniteEnseignement> ues) throws Exception {
	//		JComboBox uesJCB = new JComboBox();
	//		for (UniteEnseignement ue : ues) {
	//			if (ue.getIntitule().equals("Autre")){
	//				uesJCB.addItem("----");
	//			}
	//			else
	//				uesJCB.addItem(ue.getIntitule());
	//		}
	//		return uesJCB;
	//	}

	//	private void setUesJCB(JComboBox uesJCB, UniteEnseignement uea) throws Exception {
	//		if (uea == null)
	//			uesJCB.setSelectedIndex(0);
	//		else
	//			uesJCB.setSelectedIndex(uea.getIdent().intValue());
	//	}

	private ActionListener recordAction() {
		ActionListener recordListener = new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try {
					// on enregistre les notes
					eva.setOkAdministratif((Boolean)evaValeurs.getValueAt(0,0));
					eva.setMaster1Acquis((Boolean)evaValeurs.getValueAt(0,1));
					eva.setMoyenneBac4((Float)evaValeurs.getValueAt(0,2));
					eva.setNbBac4((Integer)evaValeurs.getValueAt(0,3));
					eva.setMoyenneBac3((Float)evaValeurs.getValueAt(0,4));
					eva.setNbBac3((Integer)evaValeurs.getValueAt(0,5));
					eva.setNoteDossier((Float)evaValeurs.getValueAt(0,7));
					eva.setOkPedagogique((Boolean)evaValeurs.getValueAt(0,8));
					eva.setRemarques((String)evaValeurs.getValueAt(0,9));
					eva.clearParcoursInterdits();
					int i = 0;
					for (Parcours par : lParcours) {
						if (jcbInterdits[i].isSelected())
							eva.addParcoursInterdits(par);
						i++;
					}
					//					eva.clearUesAcquises();
					//					for (int j=0; j<jcbAcquises.length; j++){
					//						eva.addUesAcquises(new Integer(jcbAcquises[j].getSelectedIndex()));
					//					}
					// on efface la vue
					vue.setVisible(false);
					// on revient aux dossiers
					dafa.actionPerformed(e);
				}
				catch (Exception ex){
					ex.printStackTrace();
				}
			}
		};
		return recordListener;
	}    

	public void actionPerformed(ActionEvent e) {
		try {
			//int ind;
			dos = dafa.getSelectedDossier();
			if (dos != null) {
				if(vue == null) {
					vue = new JPanel();
					vue.setLayout(new BorderLayout());
					appli.add(vue,BorderLayout.CENTER);

					JPanel nord = new JPanel();
					nord.setLayout(new BoxLayout(nord,BoxLayout.Y_AXIS));
					//nord.setLayout(new GridLayout(0,1));
					vue.add(nord, BorderLayout.NORTH);

					cursus = new JPanel();
					cursus.setLayout(new GridLayout(0,2));
					nord.add(cursus);

					notes = new JPanel();
					notes.setLayout(new GridLayout(0,1));
					scrollpane = new JScrollPane();
					scrollpane.setBorder(new BevelBorder(BevelBorder.LOWERED));
					//vue.add(scrollpane,BorderLayout.CENTER);
					notes.add(scrollpane);
					nord.add(notes);

					interdits = new JPanel();
					interdits.setLayout(new GridLayout(0,1));
					vue.add(interdits, BorderLayout.EAST);
					lParcours = appli.getBd().getParcours();
					interdits.add(new JLabel("Parcours interdits"));
					jcbInterdits = new JCheckBox[lParcours.size()];
					int i = 0;
					for (Parcours par : lParcours) {
						jcbInterdits[i] = new JCheckBox(par.getIntitule());
						interdits.add(jcbInterdits[i]);
						i++;
					}

					//					acquises = new JPanel();
					//					acquises.setLayout(new GridLayout(0,1));
					//					vue.add(acquises, BorderLayout.WEST);
					//					acquises.add(new JLabel("UEs acquises"));
					//					lUes = appli.getBd().getUniteEnseignements();
					//					jcbAcquises = new JComboBox[5]; // plus semble inutile
					//					for (int j=0; j<jcbAcquises.length; j++){
					//						jcbAcquises[j] = getUesJCB(lUes);
					//						acquises.add(jcbAcquises[j]);
					//					}
					pied = new JPanel();
					vue.add(pied, BorderLayout.SOUTH);
					suite = new JButton("Suite");
					suite.addActionListener(recordAction());
					pied.add(suite);
				}
				cursus.removeAll();
				etu = dos.getEtudiant();
				final String[] namesEtu = dafa.EnteteEtudiant;
				cursus.add(new JLabel(namesEtu[4]));
				cursus.add(new JLabel(etu.getNom()));
				cursus.add(new JLabel(namesEtu[5]));
				cursus.add(new JLabel(etu.getPrenom()));
				JCheckBox fc = new JCheckBox(namesEtu[2],etu.getFormationContinue());
				fc.setEnabled(false);
				cursus.add(fc);
				JCheckBox red = new JCheckBox(namesEtu[11],etu.getRedoublant());
				red.setEnabled(false);
				cursus.add(red);
				cursus.add(new JLabel(namesEtu[12]));
				cursus.add(new JLabel(etu.getEtablissementOrigine()));
				cursus.add(new JLabel(namesEtu[13]+" en "+etu.getAnnéeCursusAnnée1()));
				cursus.add(new JLabel(etu.getNomCursusAnnée1()));
				cursus.add(new JLabel(namesEtu[14]+" en "+etu.getAnnéeCursusAnnée2()));
				cursus.add(new JLabel(etu.getNomCursusAnnée2()));
				cursus.add(new JLabel(namesEtu[15]+" en "+etu.getAnnéeCursusAnnée3()));
				cursus.add(new JLabel(etu.getNomCursusAnnée3()));
				cursus.add(new JLabel(namesEtu[16]+" en "+etu.getAnnéeCursusAnnée4()));
				cursus.add(new JLabel(etu.getNomCursusAnnée4()));

				// initialisation des champs Evaluation
				final String[] names = {"OK administratif",
					"Bac + 4 acquis",
					"Moyenne Bac + 4",
					"Nb annees Bac + 4",
					"Moyenne Bac + 3",
					"Nb annees Bac + 3",
					"Note proposee", 
					"Note dossier",
					"OK pedagogique",
					"Rmq publique"
				};
				final Object[][] data = new Object[1][names.length];
				eva = dos.getEvaluation();
				data[0][0] = eva.getOkAdministratif();
				data[0][1] = eva.getMaster1Acquis();
				data[0][2] = eva.getMoyenneBac4();
				data[0][3] = eva.getNbBac4();
				data[0][4] = eva.getMoyenneBac3();
				data[0][5] = eva.getNbBac3();
				data[0][6] = eva.getNoteProposee();
				data[0][7] = eva.getNoteDossier();
				data[0][8] = eva.getOkPedagogique();
				data[0][9] = eva.getRemarques();

				// Create a model of the data.
				dataModel = new AbstractTableModel() {
					/**
					 * 
					 */
					private static final long serialVersionUID = 1L;
					// These methods always need to be implemented.
					public int getColumnCount() { return names.length; }
					public int getRowCount() { return 1;}
					public Object getValueAt(int row, int col) {
						return data[row][col];
					}
					public void setValueAt(Object aValue, int row, int column){
						try {
							if (column > 1 && column < 6) {
								switch(column) {
								case 2 : 
									eva.setMoyenneBac4((Float)aValue);
									break;

								case 3 : 
									eva.setNbBac4((Integer)aValue);
									break;

								case 4 :
									eva.setMoyenneBac3((Float)aValue);
									break;

								case 5 :
									eva.setNbBac3((Integer)aValue);
									break;
								default :
								}
								data[row][6] = eva.getNoteProposee();
								fireTableCellUpdated(row,6);
							}
							if (column==9)
								eva.setRemarques((String)getValueAt(row,9));
							data[row][column] = aValue;
						}
						catch(Exception ex){ex.printStackTrace();}
					}

					public String getColumnName(int column) {
						return names[column];
					}
					@SuppressWarnings({ "unchecked", "rawtypes" })
					public Class getColumnClass(int c) {
						return getValueAt(0, c).getClass();
					}
					public boolean isCellEditable(int row, int col) {
						return (col!=6);
					}
				};
				// Create the table
				evaValeurs = new JTable(dataModel){
					/**
					 * 
					 */
					private static final long serialVersionUID = 1L;

					protected JTableHeader createDefaultTableHeader(){
						return new JTableHeader(columnModel) {
							/**
							 * 
							 */
							private static final long serialVersionUID = 1L;

							public String getToolTipText(MouseEvent e){
								//	String tip = null;
								java.awt.Point p = e.getPoint();
								int index = columnModel.
								getColumnIndexAtX(p.x);
								int realIndex = columnModel.
								getColumn(index).
								getModelIndex();
								return columnToolTips[realIndex];
							}
						};
					}
				};
				//evaValeurs.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);

				// JS 2009/06/24: attempt to solve Evaluation editing
				// problem (null pointers popping up in JTable-> shows
				// up when printing evaluations)
				evaValeurs.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);

				evaValeurs.setRowHeight(2*evaValeurs.getRowHeight());	
				int i = 0;
				for (Parcours par : lParcours) {
					jcbInterdits[i].setSelected(eva.getParcoursInterdits().contains(par));
					i++;
				}

				//				SortedSet<UniteEnseignement> ues = eva.getUesAcquises();
				//				int j = 0;
				//				for (UniteEnseignement ue : ues) {
				//					setUesJCB(jcbAcquises[j], ue);
				//					j++;
				//				}
				//				for (;j<jcbAcquises.length;j++){
				//					setUesJCB(jcbAcquises[j], null);
				//				}
				scrollpane.setPreferredSize
				(new Dimension(appli.getWidth()-10,60));
				scrollpane.setViewportView(evaValeurs);
				dafa.getVue().setVisible(false);
				vue.setVisible(true);
				appli.getFrame().setVisible(true);
			}
		}
		catch(Exception ex){
			ex.printStackTrace();
			JOptionPane.showMessageDialog(appli, ex.getMessage(), "Affichage Evaluation : Attention",JOptionPane.ERROR_MESSAGE);
		}
	}
}

